//头文件
#include "sentry_interfaces/msg/robot_hp.hpp"

#include "behaviortree_cpp/behavior_tree.h"
#include "behaviortree_cpp/bt_factory.h"
#include <iostream>
namespace mynode
{
    using BT::NodeStatus;
    //行为树节点类

    //hp_get叶节点
    class hp_get : public BT::SyncActionNode
    {
        public:
            hp_get(const std::string& name, const BT::NodeConfig& config) :
            BT::SyncActionNode(name, config)
            {
            }
            // 给该节点申明端口
            static BT::PortsList providedPorts()
            {
                return { 
                    //端口设置
                        BT::InputPort<std::string>("GetHP"),
                };
            }
            // BT::NodeStatus tick() override
            // {
            //     //实现功能
            //     //setOutput("端口名称","设置端口输出值");
            //     //getInput("端口名称",端口输入值);
            //     return BT::NodeStatus::SUCCESS;
            // }
            BT::NodeStatus tick() override
            {
                //实现功能
                std::string GetHP_value;
                getInput("GetHP",GetHP_value);
                std::cout<<"机器人的生命值："<<GetHP_value<<std::endl;
                return BT::NodeStatus::SUCCESS;
            }

        
    };



    //HP叶节点
    class HP : public BT::SyncActionNode
    {
        public:
            HP(const std::string& name, const BT::NodeConfig& config) :
            BT::SyncActionNode(name, config)
            {
            }
            // 给该节点申明端口
            static BT::PortsList providedPorts()
            {
                return { 
                    //端口设置
                        BT::InputPort<sentry_interfaces::msg::RobotHP>("other_HP"),
                        BT::OutputPort<std::string>("my_HP_pub"),
                        BT::OutputPort<std::string>("my_HP"),
                        BT::InputPort<std::string>("HP_max"),
                        BT::InputPort<std::string>("HP_min"),
                };
            }
            // BT::NodeStatus tick() override
            // {
            //     //实现功能
            //     //setOutput("端口名称","设置端口输出值");
            //     //getInput("端口名称",端口输入值);
            //     return BT::NodeStatus::SUCCESS;
            // }
            BT::NodeStatus tick() override
            {
                //实现功能
                sentry_interfaces::msg::RobotHP other_hp_value;
                std::string my_HP_pub_value="100";
                std::string HP_max_value;
                std::string HP_min_value;
                std::string my_HP_value="100";

                //通过话题通信得到其他人的生命值
                getInput("other_HP",other_hp_value);
                //得到生命最小值，赋值给HP_min_value
                getInput("HP_min",HP_min_value);
                //得到生命最大值，赋值给HP_max_value
                getInput("HP_max",HP_max_value);
                //输出
                std::cout << "生命最小值：" <<HP_min_value<< std::endl;
                std::cout << "生命最大值："<<HP_max_value<< std::endl;
                std::cout<<"敌方1号机器人的生命值："<<other_hp_value.enermy_hp[1]<<std::endl;

                //向其他行为树节点输出自己的生命值
                setOutput("my_HP",my_HP_value);

                //向其他ROS节点输出自己的生命值（话题通信)
                setOutput("my_HP_pub",my_HP_pub_value);

                return BT::NodeStatus::SUCCESS;
            }

    };


    
    inline void RegisterNodes(BT::BehaviorTreeFactory& factory)
    {
        //注册节点
factory.registerNodeType<hp_get>("hp_get");

factory.registerNodeType<HP>("HP");


    }
}